package com.yunxin.customui.bean;

import lombok.Getter;
import lombok.Setter;
import org.springframework.context.ApplicationContext;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 页面对象 （页面属性和页面组件）
 *
 * @author LGY
 * @date 2021/09/06
 */
public class PageBean {

    @Setter@Getter
    Map<String, UIComponent>  components= new HashMap<>();
    Map<Integer,UIComponent>  componentsForId= new HashMap<>();
    Map<Integer, PageTemplate> pageTemplateConfigMap = new HashMap<>();

    private final PageConfig pageConfig;
    private final ApplicationContext ap;

    @Getter
    private final String pageName;
    @Getter
    private final Integer pageId;

    public PageBean(PageConfig pageConfig, ApplicationContext ap){
        this.pageConfig = pageConfig;
        this.pageName = pageConfig.pageName;
        this.pageId = pageConfig.pageId;
        this.pageTemplateConfigMap = pageConfig.getPageTemplates().stream().collect(Collectors.toMap(PageTemplate::getComponentId, v -> v, (k1, k2) -> k2));
        this.ap = ap;
    }

    /**
     * 创建组件
     *
     * @param conditionMap  数据条件
     * @return Map<组件Id,组件对象>
     */
    public PageBean createComponent(Map<String,String> conditionMap){
        List<PageTemplate> pageTemplates = pageConfig.getPageTemplates();
        doCreate(pageTemplates,conditionMap);
        return this;
    }

    /**
     * 创建组件
     *
     * @param componentId 组件id
     * @return ok的组件对象
     */
    public UIComponent createComponent(int componentId,Map<String,String> conditionMap){
//        List<PageTemplate> pageTemplates = pageConfig.getPageTemplates();
//        for (PageTemplate pageTemplate : pageTemplates) {
//            if (pageTemplate.getComponentId() == componentId){
//                CustomPageTemplate c = null;
//                UIComponent uiComponent = c.createComponent(pageTemplate.getUiComponentConfig(),conditionMap);
//                componentsForId.put(componentId,uiComponent);
//                components.put(pageTemplate.getUiAttrName(),uiComponent);
//                return uiComponent;
//            }
//        }
//        throw new GeneralException("在PageBean中没有找到 id="+componentId+"的组件配置信息");
        return null;
    }


    /**
     * 进行组件创建
     *
     * @param pageTemplates 页面组件配置集合
     * @param conditionMap  数据条件map
     */
    private void doCreate(List<PageTemplate> pageTemplates, Map<String,String> conditionMap){
        //根据数据来源将组件进行分类
//        Map<String, List<PageTemplate>> collectPageTemplate = pageTemplates.stream().collect(Collectors.groupingBy(p -> p.getUiComponentConfig().getDataSourceType()));
//        List<PageTemplate> db = collectPageTemplate.get("db");
//        collectPageTemplate.remove("no");
//        //先将数据源来自数据库的组件给创建出来
//        if (db != null){
//            for (PageTemplate component : db) {
//                //String filter = component.getUiComponentConfig().getFilter();
//               // Map<String, List<DataBean>> filterDataMap = PageUtil.filterMap(dataMap, filter);
//                doBuild(component, conditionMap);
//            }
//            collectPageTemplate.remove("db");
//        }

//        //卡片的值可以是个常量，数据库配的
//        List<PageTemplate> constant = collectPageTemplate.get("constant");
//        for (PageTemplate pageTemplate : constant) {
//            doBuild(pageTemplate, new HashMap<>());
//        }
//
//        collectPageTemplate.remove("constant");
//        //再创建数据源来自其它组件的 组件
//        for (Map.Entry<String, List<PageTemplate>> entry : collectPageTemplate.entrySet()) {
//            for (PageTemplate component : entry.getValue()) {
//                doBuildForComponent(component);
//            }
//        }

    }

//    /**
//     * 真正的组件创建(数据来自其它组件)
//     *
//     * @param component 组件配置
//     * @return 组件对象
//     */
//    public UIComponent doBuildForComponent(PageTemplate component){
//        String[] sourceComponentIds = component.getUiComponentConfig().getSourceComponentIds().split(";");
//        Map<String, List<DataBean>> componentDataS = new HashMap<>();
//        for (String sourceComponentId : sourceComponentIds) {
//            Map<String, List<DataBean>> componentData = getComponent(Integer.parseInt(sourceComponentId)).getComponentData();
//            componentDataS.putAll(componentData);
//        }
//        return doBuild(component,componentDataS);
//    }


    /**
     * 真正的组件创建(数据来自数据库)
     *
     * @param component 组件
     * @param conditionMap   条件map
     * @return  组件
     */
    public UIComponent doBuild(PageTemplate component , Map<String,String> conditionMap){

//        try {
//            //根据组件类型拿到创建策略，走策略的取数据创建组件流程
//            CustomPageTemplate customPageTemplate = (CustomPageTemplate) ap.getBean("");
//            UIComponent ui = customPageTemplate.createComponent(component.getUiComponentConfig(), conditionMap);
//            ui.setAttributeName(component.getUiAttrName());
//            componentsForId.put(component.getComponentId(),ui);
//            components.put(component.getUiAttrName(),ui);
//            return ui;
//        }catch (Exception e){
//            e.printStackTrace();
//            GeneralException exception = new GeneralException("创建组件实例错误");
//            exception.addSuppressed(e);
//            throw exception;
//        }
        return null;
    }


    /**
     * 获得组件
     *
     * @param componentId 组件id
     * @return 组件对象
     */
    public UIComponent getComponent(int componentId){
        return componentsForId.get(componentId);
    }

    public PageTemplate getPageTemplate(int componentId){
        return pageTemplateConfigMap.get(componentId);
    }
}
